In [1]:
import numpy as np
import pandas as pd
import matplotlib as plt
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots

import json
In [2]:
data = pd.read_csv("data_new.csv", delimiter=';')

with open('ukraine.json', 'r') as f:
    ukraine = json.load(f)
In [3]:
for i in ukraine['features']:
    i['id'] = i['properties']['NAME_1']
In [4]:
df = data[data['рік'] == 2017]
df["об'єм"] = data[data['рік'] == 2017]["об'єм"].to_numpy() - data[data['рік'] == 2010]["об'єм"].to_numpy()
df = pd.concat([data[data['рік'] == 2010], df])

news_column = []
for i in range(len(df)):
    if df.iloc[i]['рік'] == 2010:
        news_column.append("Об'єм в 2010 році")
    elif df.iloc[i]["об'єм"] >= 0:
        news_column.append("Збільшення об'єму в 2017 році порівняно з 2010 роком")
    else:
        news_column.append("Зменшення об'єму в 2017 році порівняно з 2010 роком")
        
df['значення'] = news_column     
C:\Users\328F~1\AppData\Local\Temp/ipykernel_30432/2253664542.py:2: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  df["об'єм"] = data[data['рік'] == 2017]["об'єм"].to_numpy() - data[data['рік'] == 2010]["об'єм"].to_numpy()
In [5]:
fig = px.bar(df, orientation='v', y = "об'єм", x = "регіон", color = 'значення', facet_col = "вид", barmode='stack', height=600, color_discrete_sequence=['#636EFA','#00CC96','#EF553B'], labels={
                     "значення": "Значення",
                     "вид": "Вид діяльності",
                     "регіон": "Регіон",
                     "об'єм": "Об'єм"
                 },)
fig.update_layout(
        title = "Зміна структури ВДВ по регіонах України за 2017 рік порівняно з 2010 роком",
        showlegend = True,
    template = "plotly_dark"
)
fig.update_layout(legend=dict(
    orientation="h",
    yanchor="bottom",
    y=1.1,
    xanchor="right",
    x=1.00
))
In [6]:
oblasti_to_codes = {'Черкаська':'Cherkasy',
 'Чернігівська':'Chernihiv',
 'Чернівецька':'Chernivtsi',
 '':'Crimea',
 'Дніпропетровська':"Dnipropetrovs'k",
 'Донецька':"Donets'k",
 'Івано-Франківська':"Ivano-Frankivs'k",
 'Харківська':'Kharkiv',
 'Херсонська':'Kherson',
 'Хмельницька':"Khmel'nyts'kyy",
 'Київська':'Kyiv',
 'м.Київ':'Kyiv City',
 'Кіровоградська':'Kirovohrad',
 'Львівська':"L'viv",
 'Луганська':"Luhans'k",
 'Миколаївська':'Mykolayiv',
 'Одеська':'Odesa',
 'Полтавська':'Poltava',
 'Рівненська':'Rivne',
 'Сумська':'Sumy',
 'Тернопільська':"Ternopil'",
 'Закарпатська':'Transcarpathia',
 'Вінницька':'Vinnytsya',
 'Волинська':'Volyn',
 'Запорізька':'Zaporizhzhya',
 'Житомирська':'Zhytomyr'}
In [7]:
df_map = df[df['рік'] == 2017].copy()
df_map['region'] = df_map['регіон'].map(oblasti_to_codes)
df_map = df_map.dropna()
In [8]:
typs = df_map['вид'].unique()
In [9]:
res_df = df_map.copy()[df_map.copy()['вид'] == typs[0]]
c1 = pd.DataFrame(np.expand_dims(np.array(['Крим - немає даних', 2017, 0.0, typs[0], "Збільшення об'єму в 2017 році порівняно з 2010 роком", 'Crimea']), axis=-1).T)
c1.columns = res_df.columns
res_df = pd.concat([res_df, c1]).reset_index(drop=True)

for typ in typs[1:]:
    proc_df = df_map.copy()[df_map.copy()['вид'] == typ]
    c1 = pd.DataFrame(np.expand_dims(np.array(['Крим - немає даних', 2017, 0.0, typ, "Збільшення об'єму в 2017 році порівняно з 2010 роком", 'Crimea']), axis=-1).T)
    c1.columns = res_df.columns
    res_df = pd.concat([res_df, proc_df, c1]).reset_index(drop=True)
    
df_map = res_df
In [10]:
fig = make_subplots(
    rows=3, cols=2,
                          vertical_spacing = 0.02,
    subplot_titles=['Вид діяльності: ' + i for i in ['сільське господарство', 'послуги', 'промисловість', 'державне управління', 'будівництво']],
    # column_widths=[0.6, 0.4],
    # row_heights=[0.4],
    specs=[[{"type": "choroplethmapbox", },
            {"type": "choroplethmapbox"}],
            [{"type": "choroplethmapbox"},
            {"type": "choroplethmapbox"}],
            [{"type": "choroplethmapbox", "colspan": 2},
             {"type": "choroplethmapbox", "colspan": 0}],
           ]
)

positions = [[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3]]
for i in range(len(df_map.вид.unique())):
    r, c = positions[i]
    typ = df_map.вид.unique()[i]
    fig.add_trace(go.Choroplethmapbox(geojson=ukraine, locations = df_map.region, z=df_map[df_map['вид'] == typ]["об'єм"], zmid = 0, hovertext = df_map['регіон'],
                                        marker_opacity=0.7, marker_line_width=0, name=typ, subplot = f"mapbox{i+1}"
                                       ),row=c, col=r)
    
fig.update_layout(
    title = "Зміна структури ВДВ по регіонах України за 2017 рік порівняно з 2010 роком",
    mapbox1_style="carto-darkmatter",
    mapbox2_style="carto-darkmatter",
    mapbox3_style="carto-darkmatter",
    mapbox4_style="carto-darkmatter",
    mapbox5_style="carto-darkmatter",
    mapbox1_zoom=4,
    mapbox2_zoom=4,
    mapbox3_zoom=4,
    mapbox4_zoom=4,
    mapbox5_zoom=4,
    mapbox1_center = {"lat": 48.3794, "lon": 31.1656},
    mapbox2_center = {"lat": 48.3794, "lon": 31.1656},
    mapbox3_center = {"lat": 48.3794, "lon": 31.1656},
    mapbox4_center = {"lat": 48.3794, "lon": 31.1656},
    mapbox5_center = {"lat": 48.3794, "lon": 31.1656}
)
# fig.update_coloraxes(showscale=False)
fig.data[0].colorbar.x=0.45
fig.data[0].colorbar.y=0.84
fig.data[0].colorbar.len=0.3

fig.data[3].colorbar.x=1
fig.data[3].colorbar.y=0.84
fig.data[3].colorbar.len=0.3


fig.data[1].colorbar.x=0.45
fig.data[1].colorbar.y=0.5
fig.data[1].colorbar.len=0.3


fig.data[4].colorbar.x=1
fig.data[4].colorbar.y=0.5
fig.data[4].colorbar.len=0.3


fig.data[2].colorbar.x=1
fig.data[2].colorbar.y=0.15
fig.data[2].colorbar.len=0.3

fig.update_layout(margin={"r":0,"l":0, "t":100 ,"b":0}, height = 1500, width = 1500, template = 'plotly_dark')
In [11]:
fig = px.treemap(data, path=['регіон', 'рік', 'вид'],
                 values="об'єм", color="вид", hover_name = 'регіон', hover_data = {'регіон':False, 'рік':False, "об'єм":True, "вид":False}, labels={"labels":"ВДВ", "parent":"рік"},
                  color_discrete_map={'(?)':'lightgrey'})
fig.update_layout(margin={"r":0,"l":0, "t":50 ,"b":0}, height = 1000, width = 1500, template = 'plotly_dark', title = "Структура ВДВ по регіонах України у 2010 та 2017 роках")
fig.show()
In [ ]: